package affichage;


import java.awt.Polygon;
import terrain.CaseTerrain;
import static java.lang.Math.sqrt;


/**
 * Classe d'affichage d'une CaseTerrain représentée par un polygone. Le polygone
 * à afficher aura comme origine le point (origineX,origineY) et un rayon de rayon
 * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
 */
public class CaseTerrainView {
	/** La case du terrain qui est affichée */
    private CaseTerrain caseT;
    /** L'abscisse du point d'origine (en haut à gauche) */
    private int origineX;
    /** L'ordonnée du point d'origine (en haut à gauche) */
    private int origineY;
    /** Le "rayon" du polygone représentant la case du terrain */
    private int rayon;
    /** La hauteur du polygone */
    private int H;
    /** La longueur du côté du polygone */
    private int S;
    /** La longueur du polygone */
    private int W;
    /** le polygone représentant la case terrain */
    private Polygon p;
	
    /**
     * Constructeur d'une CaseTerrainView
     * @param caseTer la case terrain à afficher
     */
    public CaseTerrainView(CaseTerrain caseTer) {
        rayon = 50;
        caseT = caseTer;
        p = new Polygon();
		
        H = this.getHexaHeight();
        S = this.getHexaSide();
        W = this.getHexaWidth();
	    
        origineX = (caseT.getCoordonnees().getY()) * W
                + (caseT.getCoordonnees().getX() % 2) * (W / 2);
        origineY = (caseT.getCoordonnees().getX()) * S;
		
        this.initialiserPoints();
    }

    /**
     * Méthode qui initialise les points du polygone p
     * en fonction du points d'origine (origineX,origineY)
     */
    private void initialiserPoints() {
        p.addPoint(origineX + W / 2, origineY);
        p.addPoint(origineX + W, origineY + H - S);
        p.addPoint(origineX + W, origineY + S);
        p.addPoint(origineX + W / 2, origineY + H);
        p.addPoint(origineX + 0, origineY + S);
        p.addPoint(origineX, origineY + H - S);
    }
	
    /**
     * Retourne la largeur de l'hexagone en fonction du rayon.
     * @return la largeur
     */
    public int getHexaWidth() {
        return (int) (sqrt(3.0) * this.rayon);
    }

    /**
     * Retourne la hauteur de l'hexagone en fonction du rayon.
     * @return la hauteur
     */
    public int getHexaHeight() {
        return (int) (2.0 * this.rayon);
    }

    /**
     * Retourne le "côté" de l'hexagone en fonction du rayon.
     * @return le côté
     */
    public int getHexaSide() {
        return (int) (3.0 / 2.0 * this.rayon);
    }
	
    /**
     * Getter de l'abscisse du point d'origine
     * @return l'abscisse
     */
    public int getX() {
        return origineX;
    }
	
    /**
     * Getter de l'ordonnée du point d'origine
     * @return l'ordonnée
     */
    public int getY() {
        return origineY;
    }
	
    /**
     * Getter du polygone
     * @return le polygone
     */
    public Polygon getPolygone() {
        return p;
    }
	
    /**
     * Getter du rayon d'un hexagone
     * @return le rayon
     */
    public int getRayon() {
        return rayon;
    }
	
    /**
     * Getter de la CaseTerrain associée à cette
     * CaseTerrainView
     * @return la CaseTerrain
     */
    public CaseTerrain getCaseTerrain() {
        return this.caseT;
    }
	
    /**
     * Setter de la case terrain
     * @param ct la case terrain
     */
    public void setCaseTerrain(CaseTerrain ct) {
        this.caseT = ct;
    }
	
}
